Networks and distributed storage allow data and storage space to be shared between devices located anywhere a connection is available. While improvements to both hardware and software have continued to provide data storage solutions that are not only faster but more reliable, device failures have not been completely eliminated. For example, even though storage controllers and storage devices have become more resilient and durable, failures may still occur. To guard against data loss, a storage system may include controller and/or storage redundancy so that, should one device fail, controller operation may continue and data may be recovered.
For example, in a high availability storage system, two storage controllers may mirror copies of their caches to the other controller's cache in order to support write back caching (to protect writes at a given controller while the data is still dirty, i.e. not committed to storage yet) and to avoid a single point of failure. The mirroring operation is a synchronous operation that contributes to system overhead during a write request. The mirroring operation can therefore consume a significant amount of bandwidth on the lines of communication between the two storage controllers. The mirroring operation also consumes system overhead of the storage controller that is the target of the mirroring operation, as it must consume resources to commit the mirrored data to its own cache. As a result, the caches of each storage controller are not fully available for their own purposes since a portion of each is reserved for mirroring purposes.
A need therefore exists for systems and techniques for managing redundant data that make efficient use of available hardware that improves write performance in a storage system while also reducing system overhead with respect to write mirroring.